package com.smart.community.region.controller;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.smart.community.commons.result.Result;
import com.smart.community.region.dto.ImportRequest;
import com.smart.community.region.service.ICommunityTemplateImportService;
import com.smart.community.region.vo.ImportProgress;
import com.smart.community.region.vo.ImportResult;
import com.smart.community.region.vo.TemplateValidationResult;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

/**
 * 社区模板导入控制器
 * 
 * @author Wu.Liang
 * @since 2025-01-30
 */
@Slf4j
@RestController
@RequestMapping("/region/community")
@Tag(name = "社区模板导入", description = "社区模板导入相关接口")
public class CommunityTemplateImportController {

    @Autowired
    private ICommunityTemplateImportService templateImportService;

    /**
     * 下载社区模板
     */
    @GetMapping("/template/download")
    @Operation(summary = "下载社区模板")
    public void downloadTemplate(HttpServletResponse response) {
        log.info("开始下载社区模板");
        try {
            templateImportService.downloadTemplate(response);
            log.info("社区模板下载成功");
        } catch (Exception e) {
            log.error("社区模板下载失败", e);
        }
    }

    /**
     * 上传模板文件
     */
    @PostMapping("/template/upload")
    @Operation(summary = "上传模板文件")
    public Result<String> uploadTemplate(@RequestParam("file") MultipartFile file) {
        log.info("开始上传模板文件，文件名：{}，大小：{}", file.getOriginalFilename(), file.getSize());
        try {
            String fileId = templateImportService.uploadTemplate(file);
            log.info("模板文件上传成功，文件ID：{}", fileId);
            return Result.success("文件上传成功", fileId);
        } catch (Exception e) {
            log.error("模板文件上传失败，文件名：{}", file.getOriginalFilename(), e);
            return Result.fail("文件上传失败：" + e.getMessage());
        }
    }

    /**
     * 验证模板数据
     */
    @PostMapping("/template/validate")
    @Operation(summary = "验证模板数据")
    public Result<TemplateValidationResult> validateTemplate(@RequestParam String fileId) {
        log.info("开始验证模板数据，文件ID：{}", fileId);
        try {
            TemplateValidationResult result = templateImportService.validateTemplate(fileId);
            log.info("模板数据验证完成，文件ID：{}，验证结果：{}", fileId, result);
            return Result.success("数据验证完成", result);
        } catch (Exception e) {
            log.error("模板数据验证失败，文件ID：{}", fileId, e);
            return Result.fail("数据验证失败：" + e.getMessage());
        }
    }

    /**
     * 导入模板数据
     */
    @PostMapping("/template/import")
    @Operation(summary = "导入模板数据")
    public Result<ImportResult> importTemplate(@RequestBody ImportRequest request) {
        log.info("开始导入模板数据，文件ID：{}，社区ID：{}", request.getFileId(), request.getCommunityId());
        try {
            ImportResult result = templateImportService.importTemplate(request);
            log.info("模板数据导入完成，文件ID：{}，导入结果：{}", request.getFileId(), result);
            return Result.success("数据导入完成", result);
        } catch (Exception e) {
            log.error("模板数据导入失败，文件ID：{}", request.getFileId(), e);
            return Result.fail("数据导入失败：" + e.getMessage());
        }
    }

    /**
     * 查询导入进度
     */
    @GetMapping("/template/progress/{taskId}")
    @Operation(summary = "查询导入进度")
    public Result<ImportProgress> getImportProgress(@PathVariable String taskId) {
        log.info("查询导入进度，任务ID：{}", taskId);
        try {
            ImportProgress progress = templateImportService.getImportProgress(taskId);
            log.info("导入进度查询完成，任务ID：{}，进度：{}", taskId, progress);
            return Result.success("进度查询完成", progress);
        } catch (Exception e) {
            log.error("导入进度查询失败，任务ID：{}", taskId, e);
            return Result.fail("进度查询失败：" + e.getMessage());
        }
    }
}
